/*
 * @Author: yuanchenxi 836909158@qq.com
 * @Date: 2024-07-24 16:57:31
 * @LastEditors: yuanchenxi 836909158@qq.com
 * @LastEditTime: 2024-08-29 10:49:18
 * @FilePath: \SGFEM\DataStructure\FEM\Element\include\CBARData.h
 */

#pragma once
#include "Utility/Algebra/Vector3D.h"

#include "DataStructure/Common/Constant.h"
#include "DataStructure/Common/DataStructureExport.h"
#include "DataStructure/Common/DataStructureNamespace.h"
#include "DataStructure/Common/Id.h"
#include "DataStructure/Input/Element/BeamCoordOptions.h"
#include "DataStructure/Input/Element/ElementBase.h"
#include "DataStructure/Input/Solver/DOFDirections.h"
SG_DATASTRUCTURE_FEM_NAMESPACE_OPEN
/** @brief 梁单元数据
 *
 * 单元具有两个节点，支持节点的偏置量，支持自由度释放。</p>
 * 单元可以通过定向节点和朝向矢量的方式，定义截面的朝向。 </p>
 * 支持三种定义截面的方式：</p>
 *   + 直接指定 \ref BeamSectionProperty "截面属性值"。 </p>
 *   + 使用 \ref BeamSectionStandard "标准截面库" </p>
 *   + 任意复杂形状截面，可通过截面轮廓 \ref BeamSectionArbitrary "自定义截面" </p>
 * 暂时不考虑非约束扭转（翘曲）问题
 * @author Yuan Cheni            2024.7.25
 */

struct DECLSPEC CBARData : public ElementBase
{
    CBARData () : m_go (0)
    {}

    SG::DataStructure::Common::Id   m_pId      = 0;                   ///< 属性id
    SG::DataStructure::Common::Id   m_g[2]     = { 0 };               ///< nodes' id
    SG::DataStructure::Common::I64  m_flag     = 1;                   ///< Orientation vector option 0=XYZ Basic, 1=XYZ Global, 2=Grid
    SG::DataStructure::Common::Real m_x1       = 0.0;                 ///< 朝向矢量分量
    SG::DataStructure::Common::Real m_x2       = 0.0;                 ///< 朝向矢量分量
    SG::DataStructure::Common::Real m_x3       = 0.0;                 ///< 朝向矢量分量
    SG::DataStructure::Common::Id   m_go       = 0;  ///< 定向节点; 默认值 `DEFAULT_ID` 表示不使用定向节点，使用朝向向量
    SG::DataStructure::Common::I64  m_pa       = 0;                   ///< 节点1的自由度释放
    SG::DataStructure::Common::I64  m_pb       = 0;                   ///< 节点2的自由度释放
    SG::DataStructure::Common::Real m_w1a      = 0.0;                 ///< 节点1偏移量
    SG::DataStructure::Common::Real m_w2a      = 0.0;                 ///< 节点1偏移量
    SG::DataStructure::Common::Real m_w3a      = 0.0;                 ///< 节点1偏移量
    SG::DataStructure::Common::Real m_w1b      = 0.0;                 ///< 节点2偏移量
    SG::DataStructure::Common::Real m_w2b      = 0.0;                 ///< 节点2偏移量
    SG::DataStructure::Common::Real m_w3b      = 0.0;                 ///< 节点2偏移量
    SG::DataStructure::Common::Id   m_domainId = 0;

    /**  @brief 朝向矢量，节点1和节点2 偏置矢量所在坐标系
     */
    std::vector<BeamCoordOptions> GetCoordOptions () const;

    /**  @brief 获取节点1的释放自由度
     *
     */
    DofSet GetDofSetOfPaRelease () const;

    /**  @brief 获取节点2的释放自由度
     *
     */
    DofSet GetDofSetOfPbRelease () const;

    /** @brief 获取节点1的偏移量
     */
    SG::Algebra::Vector3D GetWa () const;

    /** @brief 获取节点2的偏移量
     */
    SG::Algebra::Vector3D GetWb () const;
};

/// @brief 判断单元数据是否相等
DECLSPEC bool operator== (const CBARData &a, const CBARData &b);

SG_DATASTRUCTURE_FEM_NAMESPACE_CLOSE
